package dletic.job;

import java.io.File;
import java.io.IOException;

/**
1. 利用File构造器，new 一个文件目录file
1)在其中创建多个文件和目录
2)编写方法，实现删除file中指定文件的操作
2. 判断指定目录下是否有后缀名为.jpg的文件，如果有，就输出该文件名称
3. 遍历指定目录所有文件名称，包括子文件目录中的文件。
拓展1：并计算指定目录占用空间的大小
拓展2：删除指定文件目录及其下的所有文件

 */
public class Job {

	public static void main(String[] args) throws IOException {
		
		File file = new File("src\\com\\dletic\\file");
		
		//利用File构造器  new 一个文件目录file
		file.mkdirs();
		
		//在其中创建多个文件和目录

		//问题一：可以简写    new File("src\\com\\dletic\\file\\get").mkdir();  
		
		new File(file,"get").mkdir();
		new File(file,"get\\getAbsolutePath").createNewFile();
		//简写  new File("src\\com\\dletic\\file\\get\\getAbsolutePath").createNewFile();
		new File("src\\com\\dletic\\file\\get\\getPath").createNewFile();
		new File("src\\com\\dletic\\file\\get\\getName").createNewFile();
		new File("src\\com\\dletic\\file\\get\\length").createNewFile();
		new File("src\\com\\dletic\\file\\get\\lastModified").createNewFile();
		new File("src\\com\\dletic\\file\\get\\list").createNewFile();
		new File("src\\com\\dletic\\file\\get\\listFiles").createNewFile();
		new File("src\\com\\dletic\\file\\get\\rename").createNewFile();
		
		
		
		new File("src\\com\\dletic\\file\\create").mkdir();
		
		new File("src\\com\\dletic\\file\\create\\createNewFile").createNewFile();
		new File("src\\com\\dletic\\file\\create\\mkdir").createNewFile();
		new File("src\\com\\dletic\\file\\create\\mkdirs").createNewFile();
		new File("src\\com\\dletic\\file\\create\\delete").createNewFile();
		new File("src\\com\\dletic\\file\\create\\A.jpg").createNewFile();
		new File("src\\com\\dletic\\file\\create\\B.jpg").createNewFile();
		
		
		new File("src\\com\\dletic\\file\\judge").mkdir();

		new File("src\\com\\dletic\\file\\judge\\isDirectory").createNewFile();
		new File("src\\com\\dletic\\file\\judge\\isFile").createNewFile();
		new File("src\\com\\dletic\\file\\judge\\exists").createNewFile();
		new File("src\\com\\dletic\\file\\judge\\canReand").createNewFile();
		new File("src\\com\\dletic\\file\\judge\\canWrite").createNewFile();
		new File("src\\com\\dletic\\file\\judge\\isHidden").createNewFile();
		
		boolean delete = deleteFile(new File("src\\com\\dletic\\file\\create\\deletes"));
		if(delete){
			System.out.println("文件删除成功！");
		}else{
			System.out.println("没有该文件，请核对文件路径");
		}
		
		findJpg(new File("src\\com\\dletic\\file\\create"));
		
		System.out.println("--------------------------------------------");
		
		get(new File("src\\com\\dletic\\file"));
		
		System.out.println("--------------------------------------------");
		
		long length = getLength(new File("D:\\中软学习\\CodeSpace"));
		System.out.println("该目录占用空间:" + length);
		
		System.out.println("--------------------------------------------");
		
		deleteDir(new File("src\\com\\dletic\\file"));
		
		findAllPng(new File("D:\\中软学习\\资料"));
		
		

	}
	
	//2)编写方法，实现删除file中指定文件的操作
	public static boolean deleteFile(File file){
		if(file.exists()){
			return file.delete();
		}else{	
			return false;
		}
		
	}
	//判断指定目录下是否有后缀名为.jpg的文件，如果有，就输出该文件名称
	public static void findJpg(File file){
		//public String[] list(); 获取指定目录下的所有文件或者文件目录的名称数组。
		String[] list = file.list();
		for(String str : list){
			
			/*if(str.substring(str.length()-3).equals("jpg")){
				System.out.println(str);	
			}*/
			//问题二  选错方法
			if(str.endsWith(".jpg")){
				System.out.println(str);
			}
		}
	}
	//判断指定目录下多层是否有后缀名为.png的文件，如果有，就输出该文件名称
	public static void findAllPng(File file){
		//判断是否是文件夹
		if(file.isDirectory()){
			//是一个文件夹    取出所有
			File[] listFiles = file.listFiles();
			//遍历
			for(File fileName : listFiles){
				
				findAllPng(fileName);
			}
			
			
		}else{
			//不是文件夹 是一个文件  判断是否已“.png”结尾
			if(file.getName().endsWith(".png")){
				System.out.println(file.getName());
			}
		}
	}
	
	//3. 遍历指定目录所有文件名称，包括子文件目录中的文件。
	public static void get(File file){
			
		//先判断该文件是否存在
		if(file.exists()){
			/*//存在将文件夹或文件名打印
			System.out.println(file.getName());
			
			//判断是否是文件夹
			if(file.isDirectory()){
				//是文件夹  将目录下所有的文件创建一个File对象来使用
				File[] listFiles = file.listFiles();
				//遍历
				for(File file2 : listFiles){
					//递归 自己调自己 继续查。
					get(file2);
				}
			}*/
			//问题三：代码不够简洁。
			if(file.isFile()){
				
				System.out.println(file);
			}else{
				
				File[] listFiles = file.listFiles();
				
				for (File fileName : listFiles) {
					get(fileName);
				}
			}
					
			
		}else{
			System.out.println("该文件夹不存在，请检查路径。");
			return;
		}
		
		
	}
	
	//拓展1：并计算指定目录占用空间的大小
	public static long getLength(File file){
		
		long count = 0;
		/*//先判断是否存在该文件
		if(file.exists()){
			
			if(file.isDirectory()){
				//是文件夹  将目录下所有的文件创建一个File对象来使用
				File[] listFiles = file.listFiles();
				//遍历
				for(File file2 : listFiles){
					long length = getLength(file2);
					count += length;
				}
			}else if(file.isFile()){
				long length = file.length();
				count += length;
			}
				
			
		}else{
			System.out.println("文件路径不对！");
			
		}*/
		
		if(!file.exists()){
			//不存在 返回0
			return 0;
		}else if(file.isDirectory()){
			File[] listFiles = file.listFiles();
			for (File file2 : listFiles) {
				//判断还是文件夹  递归  返回值是long “+=”接受 
				count += getLength(file2);
			}
			
		}else if(file.isFile()){
			count += file.length();
		}
		
		return count ;

				
		
	}
	
	//拓展2：删除指定文件目录及其下的所有文件
	public static void deleteDir(File file){
		/*//先判断该文件是否存在
				if(file.exists()){
					
					//判断是否是文件夹
					if(file.isDirectory()){
								
						//是文件夹  将目录下所有的文件创建一个File对象来使用
						File[] listFiles = file.listFiles();
						//遍历
						for(File file2 : listFiles){
							//递归 自己调自己 继续查。
							deleteDir(file2);
						}
					}
					
					//加了判断  当是文件夹时不会被删掉  所以不能判断 直接删除 不管是文件还是文件夹
					if(file.isFile()){
						file.delete();
					}
					file.delete();			
					
				}else{
					
					return;
				}*/
		//判断目录是否存在，如果不存在就不去查询
				if(!file.exists()){
					return;
					//如果是一个文件夹，查询文件里所有的内容
				}else if(file.isDirectory()){
					File[] listFiles = file.listFiles();
					for (File file2 : listFiles) {
						//调用自身方法
						deleteDir(file2);
					}
				}
				//文件直接删除  不能写到else中 不然判定是文件夹不会执行 删除操作。
				file.delete();
	}
	

}
